Passed
Push — qa ( 18f73d...829d74 )
by Roy
01:29
created

unit.test.js ➔ setupProcessEnv   A

Complexity

Conditions 2

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 2
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 2
1
/* eslint-env es6, node */
2
/* eslint complexity: ['error', { max: 10 }] */ // set maximum cyclomatic complexity to 10; ref: <https://eslint.org/docs/rules/complexity>
3
// # spell-checker:ignore AllUsersProfile HomeDrive HomePath LocalAppData SystemDrive SystemRoot UserProfile cyclomatic windir
4
'use strict';
5
6
const os = require('os');
7
const path = require('path');
8
9
const test = require('ava');
10
11
const osPaths = require('../build/cjs+tests');
12
13
const isWinOS = /^win/i.test(process.platform);
14
15
const env = {
16
	defaults: process.env,
17
	signals: {
18
		ALLUSERSPROFILE: 'allusersprofile',
19
		HOME: 'home',
20
		HOMEDRIVE: 'homedrive',
21
		HOMEPATH: 'homepath',
22
		LOCALAPPDATA: 'localappdata',
23
		SystemRoot: 'systemroot',
24
		SystemDrive: 'systemdrive',
25
		TEMP: 'temp',
26
		TMPDIR: 'tmpdir',
27
		TMP: 'tmp',
28
		USERPROFILE: 'userprofile',
29
		windir: 'windir',
30
	},
31
};
32
33
function setupProcessEnv(values) {
34
	// eslint-disable-next-line functional/immutable-data , security/detect-object-injection
35
	Object.keys(values).forEach((key) => (process.env[key] = env.defaults[key]));
36
}
37
38
// * reset environment prior to each test
39
test.beforeEach((_) => {
40
	setupProcessEnv(env.defaults);
41
});
42
43
/* eslint-disable no-undefined , functional/immutable-data */
44
45
test('default', (t) => {
46
	const paths = osPaths;
47
48
	process.env.HOME = process.env.USERPROFILE = 'home';
49
	process.env.TEMP = process.env.TMP = process.env.TMPDIR = 'temp';
50
51
	t.is(paths.home(), 'home');
52
	t.is(paths.temp(), 'temp');
53
});
54
55
test('alternate construction (via function)', (t) => {
56
	const paths = osPaths();
57
58
	process.env.HOME = process.env.USERPROFILE = 'home';
59
	process.env.TEMP = process.env.TMP = process.env.TMPDIR = 'temp';
60
61
	t.is(paths.home(), 'home');
62
	t.is(paths.temp(), 'temp');
63
});
64
65
test('no os.homedir/os.tmpdir', (t) => {
66
	os.homedir = os.tmpdir = null;
67
68
	const paths = osPaths;
69
70
	process.env.HOME = process.env.USERPROFILE = 'home';
71
	process.env.TEMP = process.env.TMP = process.env.TMPDIR = 'temp';
72
73
	t.is(paths.home(), 'home');
74
	t.is(paths.temp(), 'temp');
75
});
76
77
test('no os.homedir/os.tmpdir and trailing slash in environment source', (t) => {
78
	os.homedir = os.tmpdir = null;
79
80
	const paths = osPaths;
81
82
	process.env.HOME = process.env.USERPROFILE = 'home/';
83
	process.env.TEMP = process.env.TMP = process.env.TMPDIR = 'temp/';
84
85
	t.is(paths.home(), 'home');
86
	t.is(paths.temp(), 'temp');
87
});
88
89
test('no os.homedir or environment', (t) => {
90
	os.homedir = null;
91
92
	const paths = osPaths;
93
94
	delete process.env.HOME;
95
	delete process.env.HOMEDRIVE;
96
	delete process.env.HOMEPATH;
97
	delete process.env.USERPROFILE;
98
	t.is(paths.home(), undefined);
99
100
	process.env.HOME = process.env.HOMEDRIVE = process.env.HOMEPATH = process.env.USERPROFILE = '';
101
	t.is(paths.home(), undefined);
102
});
103
104
test('os.homedir/os.tmpdir return `null`', (t) => {
105
	os.homedir = os.tmpdir = () => null;
106
107
	const paths = osPaths;
108
109
	process.env.HOME = process.env.USERPROFILE = 'home';
110
	process.env.TEMP = process.env.TMP = process.env.TMPDIR = 'temp';
111
112
	t.is(paths.home(), 'home');
113
	t.is(paths.temp(), 'temp');
114
});
115
116
test('no os.homedir and runtime variations', (t) => {
117
	const paths = osPaths;
118
119
	process.env.HOME = process.env.HOMEDRIVE = process.env.HOMEPATH = process.env.USERPROFILE = '';
120
121
	process.env.HOMEDRIVE = 'homedrive';
122
	t.is(paths.home(), isWinOS ? 'homedrive' : undefined);
123
124
	process.env.HOMEDRIVE = '';
125
	process.env.HOMEPATH = 'homepath';
126
	t.is(paths.home(), isWinOS ? 'homepath' : undefined);
127
	process.env.HOMEDRIVE = 'homedrive';
128
	t.is(paths.home(), isWinOS ? path.join('homedrive', 'homepath') : undefined);
129
130
	process.env.HOME = 'home';
131
	t.is(paths.home(), 'home');
132
133
	process.env.USERPROFILE = 'userprofile';
134
	t.is(paths.home(), isWinOS ? 'userprofile' : 'home');
135
});
136
137
test('no os.tmpdir and runtime variations', (t) => {
138
	const paths = osPaths;
139
140
	const posixFallback = '/tmp';
141
	const windowsFallback = 'C:\\Temp';
142
143
	process.env.TEMP = process.env.TMPDIR = process.env.TMP = '';
144
145
	t.is(paths.temp(), isWinOS ? path.join(process.env.LOCALAPPDATA, 'Temp') : posixFallback);
146
	process.env.LOCALAPPDATA = '';
147
	t.is(
148
		paths.temp(),
149
		isWinOS ? path.join(paths.home() || '', 'AppData', 'Local', 'Temp') : posixFallback
150
	);
151
	process.env.HOME = process.env.HOMEDRIVE = process.env.HOMEPATH = process.env.USERPROFILE = '';
152
	t.is(paths.temp(), isWinOS ? path.join(process.env.ALLUSERSPROFILE, 'Temp') : posixFallback);
153
	delete process.env.ALLUSERSPROFILE;
154
	t.is(paths.temp(), isWinOS ? path.join(process.env.SystemRoot, 'Temp') : posixFallback);
155
	process.env.SystemRoot = '';
156
	t.is(paths.temp(), isWinOS ? path.join(process.env.windir, 'Temp') : posixFallback);
157
	delete process.env.windir;
158
	t.is(paths.temp(), isWinOS ? path.join(process.env.SystemDrive + '\\', 'Temp') : posixFallback);
159
	process.env.SystemDrive = '';
160
	t.is(paths.temp(), isWinOS ? windowsFallback : posixFallback);
161
162
	process.env.TMP = 'tmp';
163
	t.is(paths.temp(), 'tmp');
164
	process.env.TEMP = 'temp';
165
	t.is(paths.temp(), 'temp');
166
	process.env.TMPDIR = 'tmpdir';
167
	t.is(paths.temp(), isWinOS ? 'temp' : 'tmpdir'); // TMPDIR is not used for Windows platforms
168
});
169
170
/* eslint-enable no-undefined , functional/immutable-data */
171